﻿Imports Negocio
Imports System.Drawing
Imports DataLayer
Imports Excepciones

Public Class GesProyectos

    Public Shared Sub Guardar(proyecto As Proyecto)
        Try
            If proyecto.Usuario Is Nothing Then
                proyecto.Usuario = Current.Usuario
            End If
            Dim repository As IRepository = RepositoryFactory.CreateTransactional()
            repository.Nombre = "PROYECTOS_PROC"
            repository.AddParameter("@ACCION", proyecto.Persistencia)
            repository.AddParameter("@ID", proyecto.OID)
            repository.AddParameter("@TITULO", proyecto.Titulo)
            repository.AddParameter("@DESCRIPCION", proyecto.Descripcion)
            repository.AddParameter("@FECHA", proyecto.Fecha)
            repository.AddParameter("@FECHAINICIO", proyecto.FechaInicio)
            repository.AddParameter("@FECHAFIN", proyecto.FechaFin)
            repository.AddParameter("@PRIORIDAD", proyecto.Prioridad)
            repository.AddParameter("@IDUSUARIO", proyecto.Usuario.OID)
            repository.ExecuteNonQuery()
            repository.Commit()
        Catch ex As Exception
            Throw New ProjectSaveException()
        End Try
        GesBitacoras.Guardar(proyecto.Persistencia, "ModProyecto", New String() {"Proyecto", proyecto.Titulo})
    End Sub

    Public Shared Sub Eliminar(proyecto As Proyecto)

        Eliminar(proyecto, True)

    End Sub

    Public Shared Sub Eliminar(proyecto As Proyecto, control As Boolean)

        If control AndAlso GesTareas.Consultar(proyecto).Count > 0 Then
            Throw New ProjectTaskDeleteException()
        Else
            proyecto.Persistencia = EstadoPersistencia.DELETE
            Guardar(proyecto)
        End If

    End Sub


    Public Shared Function CalcularHoras(proyecto As Proyecto) As Integer
        Try
            Return GesTareas.CalcularHoras(proyecto)
        Catch ex As Exception
            Throw New ProjectGetException()
        End Try

    End Function

    Public Shared Function CalcularProgreso(proyecto As Proyecto) As Decimal

        Try
            Dim horasProy As Integer = GesTareas.CalcularHoras(proyecto)

            Dim progress As Decimal = 0
            Dim tareas As List(Of Tarea) = GesTareas.Consultar(proyecto)
            If tareas.Count > 0 Then
                For Each tarea As Tarea In tareas

                    Dim porcTarea As Decimal = tarea.Horas * 100 / horasProy
                    Dim progresotarea As Decimal = GesTareas.CalcularProgreso(tarea)

                    progress += progresotarea * porcTarea / 100

                Next

                Return Math.Round(progress, 1)
            Else
                Return 0
            End If

        Catch ex As Exception
            Throw New ProjectGetException()
        End Try

    End Function

    Public Shared Function CalcularFechaEstimadaFin(proyecto As Proyecto) As System.Nullable(Of Date)
        Dim h As Date = Nothing
        Return h
    End Function

    Public Shared Function ObtenerCaminoCritico(proyecto As Proyecto) As Tarea()
        Dim t As Tarea()
        Return t
    End Function

    Public Shared Function GenerarGantt(proyecto As Proyecto) As Byte()
        Dim a As Byte()
        Return a
    End Function


    Public Shared Function Consultar(titulo As String) As List(Of Proyecto)
        Return Consultar(titulo, Nothing, Nothing, Nothing)
    End Function

    Public Shared Function Consultar(recurso As Recurso) As List(Of Proyecto)
        Return Consultar(Nothing, Nothing, recurso, Nothing)
    End Function

    Public Shared Function Consultar(prioridad As Nivel) As List(Of Proyecto)
        Return Consultar(Nothing, Nothing, Nothing, prioridad)
    End Function

    Public Shared Function Consultar(titulo As String, fecha As System.Nullable(Of Date), usuario As Usuario, prioridad As Nivel) As List(Of Proyecto)

        If String.IsNullOrWhiteSpace(titulo) Then
            titulo = Nothing
        End If

        If usuario Is Nothing Then
            usuario = New Usuario()
            usuario.OID = Nothing
        End If

        Dim proyectos As New List(Of Proyecto)

        Try
            Dim repository As IRepository = RepositoryFactory.Create()
            repository.Nombre = "PROYECTOS_PROC"
            repository.AddParameter("@ACCION", "4")
            repository.AddParameter("@ID", Nothing)
            repository.AddParameter("@TITULO", titulo)
            repository.AddParameter("@DESCRIPCION", Nothing)
            repository.AddParameter("@FECHA", Nothing)
            repository.AddParameter("@FECHAINICIO", fecha)
            repository.AddParameter("@FECHAFIN", Nothing)
            repository.AddParameter("@PRIORIDAD", prioridad)
            repository.AddParameter("@IDUSUARIO", usuario.OID)
            Dim dtProyecto As DataTable = repository.ExecuteDataTable()

            For Each dr As DataRow In dtProyecto.Rows
                Dim p As New Proyecto()
                p.Persistencia = EstadoPersistencia.UPDATE
                p.OID = Convert.ToInt32(dr.Item("proyID"))
                p.Titulo = dr.Item("proyTITULO").ToString()
                p.Descripcion = dr.Item("proyDESCRIPCION").ToString()
                p.Fecha = Convert.ToDateTime(dr.Item("proyFECHA"))
                p.FechaInicio = Convert.ToDateTime(dr.Item("proyFECHAINICIO"))
                p.FechaFin = Convert.ToDateTime(dr.Item("proyFECHAFIN"))
                p.Prioridad = Convert.ToInt32(dr.Item("proyPRIORIDAD"))
                p.Usuario = GesUsuarios.Obtener(dr.Item("usuNICK").ToString(), True)
                proyectos.Add(p)
            Next

        Catch ex As Exception
            Throw New ProjectGetException()
        End Try
        Return proyectos
    End Function

    Public Shared Function ObtenerRecursos(proyecto As Proyecto) As List(Of Recurso)

        Dim recursos As New List(Of Recurso)
        Try
            Dim repository As IRepository = RepositoryFactory.Create()
            repository.Nombre = "PROYECTO_RECURSO_PROC"
            repository.AddParameter("@ACCION", "4")
            repository.AddParameter("@IDPROYECTO", proyecto.OID)
            repository.AddParameter("@IDRECURSO", Nothing)
            Dim dtRecurso As DataTable = repository.ExecuteDataTable()

            For Each dr As DataRow In dtRecurso.Rows
                Dim recID As Integer = Convert.ToInt32(dr.Item("prIDRECURSO"))
                Dim rec As Recurso = GesRecursos.Obtener(recID)
                If Convert.ToInt32(dr.Item("BLOQUEADO")) > 0 Then
                    rec.Lock = True
                End If
                recursos.Add(rec)
            Next

        Catch ex As Exception
            Throw New ResourceGetException()
        End Try

        Return recursos

    End Function

    Public Shared Sub ActualizarRecursos(proyecto As Proyecto, recursos As List(Of Recurso))
        For Each rec As Recurso In recursos
            If Not rec.Persistencia = EstadoPersistencia.UPDATE Then
                GuardarRecurso(proyecto, rec)
            End If
        Next
    End Sub

    Public Shared Sub GuardarRecurso(proyecto As Proyecto, recurso As Recurso)
        Try
            Dim repository As IRepository = RepositoryFactory.Create()
            repository.Nombre = "PROYECTO_RECURSO_PROC"
            repository.AddParameter("@ACCION", recurso.Persistencia)
            repository.AddParameter("@IDPROYECTO", proyecto.OID)
            repository.AddParameter("@IDRECURSO", recurso.OID)
            repository.ExecuteNonQuery()
            repository.Commit()
        Catch ex As Exception
            Throw New ResourceSaveException()
        End Try

        GesBitacoras.Guardar(recurso.Persistencia, "ModProyecto", New String() {"Recurso", recurso.ToString()})
    End Sub


    Public Shared Sub AgregarRequerimiento(proyecto As Proyecto, requerimiento As Requerimiento)

    End Sub

    Public Shared Sub QuitarRequerimiento(proyecto As Proyecto, requerimiento As Requerimiento)

    End Sub

    Public Shared Sub AgregarTarea(proyecto As Proyecto, tarea As Tarea)

    End Sub

    Public Shared Sub QuitarTarea(proyecto As Proyecto, tarea As Tarea)

    End Sub

    Public Shared Sub AgregarArchivo(proyecto As Proyecto, archivo As Archivo)

    End Sub

    Public Shared Sub QuitarArchivo(proyecto As Proyecto, archivo As Archivo)

    End Sub


End Class
